今天延續昨天沒介紹到的另一種 DuckDB macro,table macro
。
在 DuckDB 中,Table Macro 和 Scalar Macro 有類似的概念,差別在於 Table Macro 回傳的結果是一個完整的表格,而不是單一的值。
簡單來說就是只有 table macro 可以放在 FROM
clause 的後面,我們先來試看看,把昨天的 T1 MACRO 放在 FROM 會怎麼樣
CREATE MACRO T1(lol) AS
lol || 'T1 Fighting!';
SELECT * FROM T1(' 2024 World ');
DuckDB 馬上噴一個 error 給我們
Catalog Error: Table Function with name t1 does not exist!
在建立 TABLE Macro,語法和 Scalar Macro 類似,主要差異在於 AS TABLE
這個部分
CREATE MACRO macro_name(parameter1, parameter2, ...) AS TABLE
SELECT ...
我們嘗試來把 T1 改寫成 TABLE Macro
CREATE MACRO T1(lol) AS TABLE
SELECT lol || 'T1 Fighting!' as lol;
SELECT * FROM T1(' 2024 World ');
我個人覺得 TABLE Macro 和 view 有點像,因為它們都可以用來生成表格並且都能出現在 FROM 子句中。但是它們有一個重要的不同之處
參數化:Table Macro 支援參數,這是它相對於 View 的一個關鍵優勢。我們可以將不同的參數傳入 Table Macro,以生成動態結果,而 View 則不支援這種靈活性。View 則是靜態的,不接受參數。
由於 DuckDB 1.1.0 現在還沒有支援 materialized view
,所以我認為,在 DuckDB 中用 Table Macro 是比用 view 更好的選擇